Typical HAL GPIO use cases for migration

This section provides information on typical HAL GPIO use cases during migration.

Use case: HAL GPIO initialization

Sequence diagram

HAL GPIO initialization (HAL1)

@startuml
title: HAL GPIO initialization (HAL1)

hide footbox
participant "User Application" as App
participant "GPIO" as GPIO

App -> App : Fill GPIO_InitTypeDef\nPin/Mode/Pull/Speed
App -> GPIO : HAL_GPIO_Init(GPIOx, &GPIO_InitStructure)

@enduml

Code snippet

HAL1

HAL2

GPIO_Init_TypeDef GPIO_InitStructure;

GPIO_InitStructure.Pin  = GPIO_PIN_5;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOx, &GPIO_InitStructure);
hal_gpio_config_t GPIO_ConfigStructure;

GPIO_ConfigStructure.mode        = HAL_GPIO_MODE_OUTPUT;
GPIO_ConfigStructure.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
GPIO_ConfigStructure.pull        = HAL_GPIO_PULL_NO;

HAL_GPIO_Init(HAL_GPIOx, HAL_GPIO_PIN_5, &GPIO_ConfigStructure);

Key changes

  1. HAL2 passes the pin as a separate argument (not only via a struct field).

  2. HAL2 separates output configuration (mode vs output type) explicitly.

  3. Naming and enum values differ between HAL1 and HAL2 for pull/mode/output type.


Use case: Configure EXTI line to specific GPIO pin

Sequence diagram

Configure EXTI line to specific GPIO pin (HAL1)

@startuml
participant "Application" as App
participant "GPIO" as GPIO
participant "EXTI" as EXTI
participant "NVIC" as NVIC

App -> GPIO: HAL_GPIO_Init()
App -> EXTI: HAL_EXTI_GetHandle()
App -> EXTI: HAL_EXTI_RegisterCallback()
App -> NVIC: HAL_NVIC_SetPriority()
App -> NVIC: HAL_NVIC_EnableIRQ()
EXTI -> App: GPIOx_Exti_FallingCb()
@enduml

Code snippet

HAL1

HAL2

GPIO_Init_TypeDef GPIO_InitStructure;
EXTI_HandleTypeDef EXTI_HandleStructure;

GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin  = GPIO_PIN_YY;

HAL_GPIO_Init(GPIOx, &GPIO_InitStructure);

HAL_EXTI_GetHandle(&EXTI_HandleStructure, $EXTI_LINE_NUMBER$);

HAL_EXTI_RegisterCallback(&EXTI_HandleStructure,
                         HAL_EXTI_FALLING_CB_ID,
                         GPIOx_Exti_FallingCb);

HAL_NVIC_SetPriority(EXTI$EXTI_LINE_NUMBER$_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI$EXTI_LINE_NUMBER$_IRQn);

static void GPIOx_Exti_FallingCb(void)
{
  (...)
}
hal_gpio_config_t GPIO_ConfigStructure;
hal_exti_handle_t hexti;
hal_exti_config_t EXTI_ConfigStructure;

GPIO_ConfigStructure.mode = HAL_GPIO_MODE_INPUT;
GPIO_ConfigStructure.pull = HAL_GPIO_PULL_NO;

HAL_GPIO_Init(HAL_GPIOx, HAL_GPIO_PIN_YY, &GPIO_ConfigStructure);

HAL_EXTI_Init(&hexti, HAL_EXTI_GPIO_YY);

EXTI_ConfigStructure.trigger  = HAL_EXTI_TRIGGER_FALLING;
EXTI_ConfigStructure.gpio_port = HAL_EXTI_GPIOX;
HAL_EXTI_SetConfig(&hexti, &EXTI_ConfigStructure);

HAL_EXTI_RegisterTriggerCallback(&hexti, GPIOx_Exti_FallingCb);

HAL_NVIC_SetPriority(EXTI$EXTI_LINE_NUMBER$_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI$EXTI_LINE_NUMBER$_IRQn);

HAL_EXTI_Enable(&hexti, HAL_EXTI_MODE_INTERRUPT);

static void GPIOx_Exti_FallingCb(void)
{
  (...)
}

Key changes

  1. HAL2 uses an explicit EXTI handle init + config sequence (HAL_EXTI_Init / HAL_EXTI_SetConfig) instead of retrieving a handle via HAL_EXTI_GetHandle.

  2. Callback registration differs: HAL2 registers a trigger callback through the EXTI handle.

  3. EXTI start/enable is explicit in HAL2 (enable interrupt mode after configuration).